/** @file GameSquare.h */

#ifndef GAMESQUARE_H
#define GAMESQUARE_H

/*
 * Autori: Jan Seda xsedaj00
 *         Ivo Stepanek xstepa39
 *
 * Kodovani:
 * Datum: 8.5.2011
 * Popis: Zdrojovy soubor k projektu pro predmet ICP. Implementace reprezentace jednoho policka hraci desky.
 */

#include <iostream>
#include <QtGui>
#include <QtCore>
#include <QGraphicsItem>
#include <QGraphicsScene>
#include <QPainter>
#include <QStyleOption>
#include <QVector>

#include <math.h>
#include "PlayersColors.h"
#include "GameConst.h"


//! pero normalni tloustky
const int NORMAL_PEN_WIDTH = 1;

//! pero s vetsi tloustkou
const int BOLD_PEN_WIDTH = 3;

/*!
  \brief Trida GameSquare
         Trida GameSquare reprezentuje jedno policko herni desky.
*/
class GameSquare : public QObject, public QGraphicsItem
{
    Q_OBJECT

signals:
   //! Signal emitovany pri kliku na herni policko.
   /*!
     \param _index index policka
     \param _type typ policka
     \param _player cislo hrace, ktery na policko kliknul
    */
   void squareClick(int _index, int _type, int _player);


public:
   //! Konstruktor
   GameSquare(int _square_size, QColor _brush, QString _icon_name);
   //! Konstruktor
   GameSquare(int _square_size, QColor _brush);
   //! Konstruktor
   GameSquare(int _square_size);
   //! Konstruktor
   GameSquare(){}
   //! Destruktor
   ~GameSquare(){}

   //! Metoda pro nastaveni hernich atributu policka.
   /*!
    \param _index index policka v ramci hraci desky
    \param _type typ policka (startovniho domecku / hraci desky / koncoveho domecku)
    \param _player_occup index hrace okupujiciho policko
    */
   void setParams(int _index, int _type, int _player_occup)
                 {index = _index; type = _type; player_occup = _player_occup;}
                  
   //! Metoda pro nastaveni indexu hrace okupujiciho toto policko.
   /*!
    \param _player_occup index hrace okupujiciho polick
    */
   void setPlayerOccup(int _player_occup){player_occup = _player_occup;}
    
    //! Metoda pro nastaveni cisla obrazku zobrazeneho v policku.
	/*!
	 \param _icon_number cislo obrazku
	 */
    void setIconNumber(int _icon_number){icon_number = _icon_number;}
    
    //! Metoda pro nastaveni nazvu obrazku zobrazeneho v policku.
	/*!
	 \param _icon_name nazev obrazku
	 */
    void SetIconName(QString _icon_name) {icon_name = _icon_name;}

    //! Metoda pro zjisteni velikosti hrany obrazku zobrazeneho v policku.
	/*!
	 \return velikost hrany ctvercoveho obrazku
	 */
    int SquareSize() {return square_size;}
    
    //! Metoda pro zjisteni hrace, ktery ma obsazene dane policko.
	/*!
	  \return vraci index hrace
	 */
    int getPlayerOccup() {return player_occup;}
    
    //! Metoda pro zjisteni cisla obrazku zobrazenem v policku.
	/*!
	 \return vraci cislo obrazku
	*/
    int getIconNumber() {return icon_number;}
    
    //! Metoda pro zjisteni typu policka.
	/*!
	 \return vraci typ policka jako celociselnou hodnotu 
	 */
    int getType(){return type;}
    
    //! Metoda pro zjisteni indexu policka v ramci hraci desky
	/*!
	  \return vraci index policka
	 */
    int getIndex(){return index;}
    
    //! Metoda pro zjisteni zda je dane policko aktivni. 
	/*!
	  Aktivitou se rozumi stav kdy hrac oznacil policko, ale jeste na nej nestoupnul.
	  \return vraci pravdivostni hodnotu reflektujici aktualni stav
	*/
    bool isActive() {return active;}
    
    //! Metoda pro zjisteni jmena obrazku vyobrazenem v policku
	/*!
	  \return vraci retezec se jmenem obrazku
	*/
    QString IconName() {return icon_name;}

    //! Metoda pro nastaveni aktivity policka
	/*!
	 \param player index hrace
	*/
    void setActive(int player);
	
	//! Metoda pro deaktivaci policka
	/*!
	  \param player index hrace
	 */
	void setUnactive (int player = 0);
	
	//! Metoda pro nastaveni okupanta policka
	/*!
	  \param player index hrace
	*/
    void setOccup(int player);
	
	//! Metoda pro osvobozeni policka od hrace
    void setFree();
    
    //! Virtualni metoda jejiz implementace je pozadvana frameworkem Qt kvuli vykreslovani QGraphicsItem
    QRectF boundingRect() const;
	
	//! Metoda zajistujici vykresleni kostky pri vytvoreni nebo aktualizaci.
	/*!
	\param painter kreslitko
	\param option volby
	\param widget ukzatel na element, ktery zachytil kliknuti
	*/
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
                    QWidget *widget);

    //! Metoda pro znovunacteni grafiky policka. Volano napriklad po zmene graficke sablony.
    /*!
      \param path cesta k adresari, kde jsou ulozene obrazky reprezentujici jednotlive ikonky (meni se pri zmene graficke sablony)
      \param home_number Nepovinny parametr reprezentujici poradove cislo domecku hrace na hraci plose
      */
    void updateSquare(QString path, int home_number = 0);

    void mousePressEvent(QGraphicsSceneMouseEvent * event);


  private:
    //! promena slouzici pro vykresleni kostky
	/*!
	  Kostka je graficky reprezentovana jako kruh. Zde je ulozen jeji polomer.
	*/
    double circle_r;
	
	//! promena uchovavajici velikost
	/*!
	  Do kostky je v zavisloti na hodu vykreslen ctvercovy obrazek. V teto promene je uchovana velikost hrany ctvercoveho obrazku.
	*/
    int square_size;
	
	//! Stavova promena pro ukladani udaju o aktivite policka
    bool active;
	
	//! index okupujiciho hrace
    int player_occup;
	
	//! typ policka
    int type;
	
	//! index policka v ramci hraci desky
    int index;
	
	//! cislo obrazku 
    int icon_number;
	
	//! barva vyplne policka
    QColor brush;
	
	//! jmeno obrazku
    QString icon_name;
	
	//! vykreslovaci pero
    QPen pen;
};

#endif // GAMESQUARE_H
